package experiment.e04.code;

import java.util.Random;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/9/29 16:35
 * @package experiment.e04.code
 * @description
 * 编写一个完整的Java Application程序，包含接口Shape，Circle类和Square类实现接口shape，Test类测试Circle和Square，具体要求如下:
 *    1）接口Shape：包含方法
 *        double getArea（）：求一个形状的面积
 *        double getPerimeter（）：求一个形状的周长
 *    2）Circle类：具有以下属性和方法：
 *       属性radius：double类型，表示圆的半径。
 *       方法：Circle（double r）：构造函数
 *       toString(): 输出圆的相关信息（半径等）。
 *    3）Square类：具有以下属性和方法：
 *       属性length，width：均是double类型，表示长方形的长和宽。
 *       方法：Square（double x，double y）：构造函数
 *       toString(): 输出长方形的相关信息（长 宽等）
 *    4）Test类作为主类完成测试功能：
 *       输出圆的周长和面积。
 *       输出长方形的周长和面积
 *       产生随机数决定生成形状的类型，偶数就生成一个Circle对象，奇数就生成一个Square对象，将生成的对象赋值给接口句柄，计算并输出该形状的周长和面积。
 */

public class E02 {
    public static void main(String[] args) {
        // 创建一个圆
        Circle circle = new Circle(4);
        System.out.println(circle.getArea());
        System.out.println(circle.getPerimeter());
        System.out.println(circle);

        // 创建一个矩形
        Square square = new Square(4, 6);
        System.out.println(square.getArea());
        System.out.println(square.getPerimeter());
        System.out.println(square);

        // 随机产生奇数偶数
        int i = new Random().nextInt(9);
        System.out.println(i);
        Shape s ;
        if (i % 2 == 0){
            s = new Circle(5);
        }else {
            s = new Square(4,5);
        }
        System.out.println(s.getArea());
        System.out.println(s.getPerimeter());
    }
}

interface Shape{
    /**
     * 求一个形状的面积
     * @return
     */
    public abstract double getArea();

    /**
     * 求一个形状的周长
     * @return
     */
    public abstract double getPerimeter();
}

class Circle implements Shape{
    private double radius;
    private final double PI = Math.PI;

    public Circle() {
    }

    public Circle(double radius) {
        this.radius = radius;
    }

    /**
     * 求一个形状的面积
     *
     * @return
     */
    @Override
    public double getArea() {
        return radius * PI * radius;
    }

    /**
     * 求一个形状的周长
     *
     * @return
     */
    @Override
    public double getPerimeter() {
        return 2 * PI * radius;
    }

    @Override
    public String toString() {
        return "Circle{" +
                "radius=" + radius +
                ", area=" + getArea() +
                ", perimeter=" + getPerimeter() +
                '}';
    }
}

class Square implements Shape{
    private double length;
    private double width;


    public Square(double length, double width) {
        this.length = length;
        this.width = width;
    }

    /**
     * 求一个形状的面积
     *
     * @return
     */
    @Override
    public double getArea() {
        return length * width;
    }

    /**
     * 求一个形状的周长
     *
     * @return
     */
    @Override
    public double getPerimeter() {
        return (length + width) * 2;
    }

    @Override
    public String toString() {
        return "Square{" +
                "length=" + length +
                ", width=" + width +
                ", area=" + getArea() +
                ", perimeter=" + getPerimeter() +
                '}';
    }
}